# -*- coding:utf-8 -*-
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号

# 展示所有的列
pd.set_option('display.max_columns', None)

data = pd.read_csv('earphone_sentiment.csv')# 原来的文件编码是GB2312，需要另存为utf-8，不然会读出乱码
data = data.fillna('无')# 填充缺失值
print(data)

print(data.subject.value_counts())
data_subject_count = data.subject.value_counts()
data_sentiment_word_count = data.sentiment_word.value_counts()
data_sentiment_value_count = data.sentiment_value.value_counts()
print(list(data_sentiment_value_count.index))

##Task-1:柱状图（不同主题，不同情感，不同情感词）
fig = plt.figure(figsize=(12, 10))# figsize不能不设置不然会导致图重叠
plt.rcParams["font.family"] = "SimHei"#设置中文字体
#子图还是用ax比较好
ax1 = fig.add_subplot(221) #添加第一个子图,只能传入一个三位数字，分别表示子图行数、列数、当前子图序号
ax1.bar(list(data_subject_count.index), height=data_subject_count)
ax1.set_title("主题subject")

ax2 = fig.add_subplot(222)
ax2.bar(list(data_sentiment_word_count.index), height=data_sentiment_word_count)
ax2.set_xticklabels(list(data_sentiment_word_count.index), fontsize=4)#设置x坐标轴
ax2.set_title("情感词sentiment_word")

ax3 = fig.add_subplot(223)
ax3.bar(list(data_sentiment_value_count.index), height=data_sentiment_value_count)
#ax3.set_xticklabels(list(data_sentiment_value_count.index), fontsize=20)#设置x坐标轴
ax3.set_title("情感分析sentiment_value")
plt.show()

##Task-2 对评价内容(content)进行分词,将高频词做成词云
import jieba.analyse      #jieba是分词用的包
#将content连成一个长句，dataframe是可迭代对象
contents = ""
for content in data['content']:
    contents = contents+content
print(contents)

#用jieba分词
most_words = jieba.analyse.extract_tags(contents, topK=100, withWeight=True, allowPOS=())
print(most_words)

#利用wordcloud生成词云
from wordcloud import WordCloud
#生成由词和对应词频的字典
words_dict = {}
for word_tuple in most_words:
    word = word_tuple[0]
    freq = word_tuple[1]
    word_dict = {word: freq}
    words_dict.update(word_dict)
print(words_dict)
wc = WordCloud(font_path='simkai.ttf', background_color='white', max_words=100)
#generate_from_frequencies()方法需要传入词和词频构成的字典
wc.generate_from_frequencies(words_dict)
wc.to_file('词云.png')

# Task-3相关性系数热力图（不同主题，不同情感，不同情感词）
# 计算主题与情感词的相关关系
# 数据透视
# 透视表，对每个主题下每个情感词对应的数量计数
data_pivot = data.pivot_table(index='sentiment_word', columns='subject', values='content_id', aggfunc='count')
data_pivot = data_pivot.fillna(0)
print(data_pivot)

#生成相关系数的矩阵
corr = np.corrcoef(data_pivot)
print(corr)

#画热力图
import seaborn as sns
plt.figure()
sns.heatmap(data_pivot, vmin=0, vmax=50)
plt.show()